//给定一个32位整数 num，你可以将一个数位从0变为1。请编写一个程序，找出你能够获得的最长的一串1的长度。 
//
// 示例 1： 
//
// 输入: num = 1775(110111011112)
//输出: 8
// 
//
// 示例 2： 
//
// 输入: num = 7(01112)
//输出: 4
// 
//
// Related Topics 位运算 动态规划 👍 122 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-07-17 00:10:17
 * @description 面试题 05.03.翻转数位
 */
public class ReverseBitsLcci{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 ReverseBitsLcci fun=new ReverseBitsLcci();
	 	 Solution solution = fun.new Solution();
		 System.out.println(5^0);
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 // 全是1的数再加1一定是2的幂减1
		 public int reverseBits1(int num) {
			 int max = 0;
			 int reverse = 0;
			 int current = 0;
			 for(int i=0;i<32;i++){
				 // 如果当前位是1，记录当前值current表示当前连续1的个数，reverse表示翻转当前0后连续1的个数
				 if((num&1)==1){
					 current++;
					 reverse++;
				 }else{
					 // 遇到0，说明可以翻转，先把current加到reverse中，然后把current清0，继续往后遍历
					 // 这里相当于把当前0翻转成1了
					 //第二次遇到0 会把reverse也重置，因为只能翻转一个0
					 reverse = current+1;
					 current = 0;
				 }
				 // 每次都更新最大值
				 if(reverse>max) max = reverse;
				 num >>= 1;
			 }
			 return max;
		 }
	public int reverseBits(int num) {
		int l=0,r=0,Max=0;//以0为分界点，L是0左边连续1的数量，R是0右边连续1的数量，Max记录最大值
		for(int i=0;i<32;i++){
			if((num&1)==1) r++;
				//当遇见0时， 0的左边连续1的数量等于上一个0右边连续1的数量加一（0本身反转后算一个长度）
			else {
				l=r+1;
				r=0;
			}
			Max=Math.max(l+r,Max);
			num>>=1;
		}
		return Max;

	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
